package com.github.xtranslation.core.repository;

import io.vavr.control.Option;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * TransRepositoryFactory: 翻译仓库工厂类
 * <p>
 * 翻译框架的仓库管理核心组件，负责翻译仓库实例的注册、管理和获取。
 * 采用工厂模式和单例模式设计，通过 ConcurrentHashMap 实现线程安全的仓库实例缓存。
 * </p>
 * <p>
 * 核心职责：
 * 1. 仓库注册：提供统一的仓库注册接口
 * 2. 仓库存储：使用线程安全的Map存储仓库实例
 * 3. 仓库获取：根据仓库类型获取对应的仓库实例
 *
 * @author zhangxiaoxiang
 * @see TransRepository
 * @see com.github.xtranslation.core.repository.dict.DictTransRepository
 * @since 2025/7/27
 */
public class TransRepositoryFactory {

    /**
     * 翻译仓库实例缓存容器
     * <p>
     * 使用线程安全的ConcurrentHashMap存储仓库类与仓库实例的映射关系。
     * Key为仓库类的Class对象，Value为对应的仓库实例。
     * </p>
     */
    private final static Map<Class<? extends TransRepository>, TransRepository> TRANS_REPOSITORY_MAP = new ConcurrentHashMap<>();

    /**
     * 根据仓库类型获取仓库实例
     * <p>
     * 从缓存容器中获取指定类型的仓库实例。
     * 如果该类型仓库未注册，则返回null。
     * </p>
     *
     * @param repository 翻译仓库的Class对象
     * @return 对应的翻译仓库实例，如果未找到则返回null
     */
    public static TransRepository getTransRepository(Class<? extends TransRepository> repository) {
        return TRANS_REPOSITORY_MAP.get(repository);
    }

    /**
     * 注册翻译仓库实例
     * <p>
     * 将翻译仓库实例注册到缓存容器中。
     * 使用仓库实例的Class作为Key进行存储。
     * </p>
     * <p>
     * 注册流程：
     * 1. 检查传入的仓库实例是否为空
     * 2. 使用Option处理空值情况，避免空指针异常
     * 3. 将仓库实例以getClass()为Key存入缓存容器
     * </p>
     *
     * @param transRepository 需要注册的翻译仓库实例
     */
    public static void register(TransRepository transRepository) {
        Option.of(transRepository).forEach(repo -> TRANS_REPOSITORY_MAP.put(repo.getClass(), repo));
    }

    /**
     * 清空所有已注册的仓库实例
     * <p>
     * 清空缓存容器中的所有仓库实例映射关系。
     * 主要用于测试环境，确保测试之间的隔离性。
     * </p>
     */
    public static void clear() {
        TRANS_REPOSITORY_MAP.clear();
    }

}
